/** *************************************************************************
 *  @file       main.c
 *  @brief	    TSNLight主函数
 *  @date		2021/11/26
 *  @author		junshuai.li
 *  @version	3.3.0
 修改人：李军帅
version3.3.1  0x2021113001
1、屏蔽读取HCP外围逻辑版本的功能
****************************************************************************
version3.3.0  0x2021112601
1、修改各个状态机的功能，
	网络初始化只进行网络接口初始化
	基础配置解析基础配置的xml文本，并进行配置，文本中时间同步参数和LID转发表
	规划配置解析规划配置的xml文本，并进行配置，文本中只有lid、addr、data
	时间同步只修改了发送报文和接收报文的接口
	状态监测未修改
2、修改发送报文和接收报文的接口，增加write和read的功能，取消主动上报的功能
3、在主函数中不再统一接收报文，在各个需要接收报文的模块独立接收
 ****************************************************************************/

#include "basic_cfg/basic_cfg.h"
#include "local_cfg/local_cfg.h"
#include "sync/sync.h"
#include "net_run/net_run.h"
#include "net_init/net_init.h"
#include <signal.h>

#define STOP_SHELL_FILENAME "stop_file.sh"

void handler(int sig)
{
	// int ret = -1;
	char tmp_buf[64] = {0};

	printf("%s\n", "TSNLight is over!!!");

	sprintf(tmp_buf, "sh %s", STOP_SHELL_FILENAME);
	system(tmp_buf);

	printf("*************KILL PTP AND TSNLIGHT********************\n");

	exit(0);
}

void create_debug_file()
{
	FILE *fp;
	char str[] = "****** debug message ******\n";
	fp = fopen("debug_log.txt", "w");
	fwrite(str, sizeof(char), strlen(str), fp);
	fclose(fp);
	return;
}

int main(int argc, char *argv[])
{
	setbuf(stdout, NULL);

	int ret = 0;

	u16 tsnlight_mid = 0;
	u32 sync_mode = 0;

	// 初始化进程
	char test_rule[64] = {0};
	char temp_net_interface[16] = {0};

	u32 sw_version = 0x20240224;
	node_mid_table table = {0};
	int tsn_type = 0; // 0表示fpga模式，1表示sim模式

	// 网络运行
	tsnlight_reg_data run_data = {0};
	node_ver_table ver_table[MAX_NODE_NUM] = {0};

	run_data.ver_num = htonl(sw_version);

	if (argc != 2)
	{
		printf("input format:./tsnlight net_interface\n");
		return 0;
	}

	sprintf(temp_net_interface, "%s", argv[1]);

	signal(SIGINT, handler);

	create_debug_file();

#ifdef TSN_SIM
	tsn_type = 1;
	write_debug_msg("TSN_SIM \n");
#endif
#ifdef TSN_FPGA
	tsn_type = 0;
	write_debug_msg("TSN_FPGA \n");
#endif

	// 进入网络初始化状态
	ret = net_init(temp_net_interface, &tsnlight_mid, &sync_mode, sw_version);
	if (ret == -1)
	{
		printf("net_init fail\n");
		resource_clear(temp_net_interface);
		return 0;
	}

	// 进入基础配置状态，在基础配置中对时间同步的参数赋值
	ret = basic_cfg(temp_net_interface, tsn_type, sw_version, tsnlight_mid, &table, &ver_table[0]);
	if (ret == -1)
	{
		printf("basic_cfg fail\n");
		resource_clear(temp_net_interface);
		handler(0);
		return 0;
	}
	else
	{
		run_data.node_num = htonl(table.num);
		run_data.link_ok = htonl(1); // 代表物理链路与逻辑链路一致
	}

	// 进入本地规划配置状态
	ret = local_cfg();
	if (ret == -1)
	{
		printf("local_cfg fail\n");
		resource_clear(temp_net_interface);
		handler(0);
		return 0;
	}

	// 进入时间同步状态
	ret = sync_start(temp_net_interface, &table, tsn_type, sync_mode);
	if (ret == -1)
	{
		printf("sync_start fail\n");
		resource_clear(temp_net_interface);
		handler(0);
		return 0;
	}
	else
	{
		run_data.syn_ok = htonl(1); // 代表进入时间同步状态
	}

	// 进入网络运行状态
	ret = net_run_handle(&table, sync_mode, &run_data, &ver_table[0]);
	if (ret == -1)
	{
		printf("net_run_handle fail\n");
		resource_clear(temp_net_interface);
		handler(0);
		return 0;
	}

	resource_clear(temp_net_interface);

	return 0;
}
